From 76946dd67bc856eaf4fe69d0826547a794176f78 Mon Sep 17 00:00:00 2001
From: Sylvain Gault <sylvain.gault@gmail.com>
Date: Tue, 29 Sep 2015 04:45:09 +0200
Subject: [PATCH] bios: Don't try to guess the sections alignment

For the compression / decompression to succeed, the sections layout must
be the same between the virtual memory and load memory. The section
alignment was kept in sync by introducing aligment that should be
greater or equal to the actual section alignment.

This patch compute the load memory addresses of the sections so that
the layout is the same as the virtual memory addresses.

Signed-off-by: Sylvain Gault <sylvain.gault@gmail.com>
Tested-by: poma <pomidorabelisima@gmail.com>
Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>

Upstream: 0cc9a99e560a2f52bcf052fd85b1efae35ee812f
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 core/i386/syslinux.ld   | 63 ++++++++++---------------------------------------
 core/x86_64/syslinux.ld | 63 ++++++++++---------------------------------------
 2 files changed, 24 insertions(+), 102 deletions(-)

diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld
index 73904510..92b75b11 100644
--- a/core/i386/syslinux.ld
+++ b/core/i386/syslinux.ld
@@ -255,10 +255,9 @@ SECTIONS
 	. = 0x100000;
 
 	__pm_code_start = .;
+	__vma_to_lma = __pm_code_lma - __pm_code_start;
 
-	__text_vma = .;
-	__text_lma = __pm_code_lma;
-	.text : AT(__text_lma) {
+	.text : AT(ADDR(.text) + __vma_to_lma) {
 		FILL(0x90909090)
 		__text_start = .;
 		*(.text)
@@ -266,106 +265,68 @@ SECTIONS
 		__text_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__rodata_vma = .;
-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
-	.rodata : AT(__rodata_lma) {
+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
 		__rodata_start = .;
 		*(.rodata)
 		*(.rodata.*)
 		__rodata_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__ctors_vma = .;
-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
-	.ctors : AT(__ctors_lma) {
+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
 		__ctors_start = .;
 		KEEP (*(SORT(.ctors.*)))
 		KEEP (*(.ctors))
 		__ctors_end = .;
 	}
 
-	__dtors_vma = .;
-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
-	.dtors : AT(__dtors_lma) {
+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
 		__dtors_start = .;
 		KEEP (*(SORT(.dtors.*)))
 		KEEP (*(.dtors))
 		__dtors_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynsym_vma = .;
-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
-	.dynsym : AT(__dynsym_lma) {
+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
 		__dynsym_start = .;
 		*(.dynsym)
 		__dynsym_end = .;
 	}
 	__dynsym_len = __dynsym_end - __dynsym_start;
 
-	. = ALIGN(4);
-
-	__dynstr_vma = .;
-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
-	.dynstr : AT(__dynstr_lma) {
+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
 		__dynstr_start = .;
 		*(.dynstr)
 		__dynstr_end = .;
 	}
 	__dynstr_len = __dynstr_end - __dynstr_start;
 
-	. = ALIGN(4);
-
-	__gnu_hash_vma = .;
-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
-	.gnu.hash : AT(__gnu_hash_lma) {
+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
 		__gnu_hash_start = .;
 		*(.gnu.hash)
 		__gnu_hash_end = .;
 	}
 
 
-	. = ALIGN(4);
-
-	__dynlink_vma = .;
-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
-	.dynlink : AT(__dynlink_lma) {
+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
 		__dynlink_start = .;
 		*(.dynlink)
 		__dynlink_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__got_vma = .;
-	__got_lma = __got_vma + __text_lma - __text_vma;
-	.got : AT(__got_lma) {
+	.got : AT(ADDR(.got) + __vma_to_lma) {
 		__got_start = .;
 		KEEP (*(.got.plt))
 		KEEP (*(.got))
 		__got_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynamic_vma = .;
-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
-	.dynamic : AT(__dynamic_lma) {
+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
 		__dynamic_start = .;
 		*(.dynamic)
 		__dynamic_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__data_vma = .;
-	__data_lma = __data_vma + __text_lma - __text_vma;
-	.data : AT(__data_lma) {
+	.data : AT(ADDR(.data) + __vma_to_lma) {
 		__data_start = .;
 		*(.data)
 		*(.data.*)
diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld
index bf815c46..70c6e00a 100644
--- a/core/x86_64/syslinux.ld
+++ b/core/x86_64/syslinux.ld
@@ -255,10 +255,9 @@ SECTIONS
 	. = 0x100000;
 
 	__pm_code_start = .;
+	__vma_to_lma = __pm_code_lma - __pm_code_start;
 
-	__text_vma = .;
-	__text_lma = __pm_code_lma;
-	.text : AT(__text_lma) {
+	.text : AT(ADDR(.text) + __vma_to_lma) {
 		FILL(0x90909090)
 		__text_start = .;
 		*(.text)
@@ -266,106 +265,68 @@ SECTIONS
 		__text_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__rodata_vma = .;
-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
-	.rodata : AT(__rodata_lma) {
+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
 		__rodata_start = .;
 		*(.rodata)
 		*(.rodata.*)
 		__rodata_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__ctors_vma = .;
-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
-	.ctors : AT(__ctors_lma) {
+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
 		__ctors_start = .;
 		KEEP (*(SORT(.ctors.*)))
 		KEEP (*(.ctors))
 		__ctors_end = .;
 	}
 
-	__dtors_vma = .;
-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
-	.dtors : AT(__dtors_lma) {
+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
 		__dtors_start = .;
 		KEEP (*(SORT(.dtors.*)))
 		KEEP (*(.dtors))
 		__dtors_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynsym_vma = .;
-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
-	.dynsym : AT(__dynsym_lma) {
+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
 		__dynsym_start = .;
 		*(.dynsym)
 		__dynsym_end = .;
 	}
 	__dynsym_len = __dynsym_end - __dynsym_start;
 
-	. = ALIGN(4);
-
-	__dynstr_vma = .;
-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
-	.dynstr : AT(__dynstr_lma) {
+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
 		__dynstr_start = .;
 		*(.dynstr)
 		__dynstr_end = .;
 	}
 	__dynstr_len = __dynstr_end - __dynstr_start;
 
-	. = ALIGN(4);
-
-	__gnu_hash_vma = .;
-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
-	.gnu.hash : AT(__gnu_hash_lma) {
+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
 		__gnu_hash_start = .;
 		*(.gnu.hash)
 		__gnu_hash_end = .;
 	}
 
 
-	. = ALIGN(4);
-
-	__dynlink_vma = .;
-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
-	.dynlink : AT(__dynlink_lma) {
+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
 		__dynlink_start = .;
 		*(.dynlink)
 		__dynlink_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__got_vma = .;
-	__got_lma = __got_vma + __text_lma - __text_vma;
-	.got : AT(__got_lma) {
+	.got : AT(ADDR(.got) + __vma_to_lma) {
 		__got_start = .;
 		KEEP (*(.got.plt))
 		KEEP (*(.got))
 		__got_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynamic_vma = .;
-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
-	.dynamic : AT(__dynamic_lma) {
+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
 		__dynamic_start = .;
 		*(.dynamic)
 		__dynamic_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__data_vma = .;
-	__data_lma = __data_vma + __text_lma - __text_vma;
-	.data : AT(__data_lma) {
+	.data : AT(ADDR(.data) + __vma_to_lma) {
 		__data_start = .;
 		*(.data)
 		*(.data.*)
-- 
2.13.3

